package fr.upmc.mdoc.tp1.forms;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;

import fr.upmc.mdoc.tp1.domain.DAOContactGroup;
import fr.upmc.mdoc.tp1.models.Address;
import fr.upmc.mdoc.tp1.models.Contact;
import fr.upmc.mdoc.tp1.models.ContactGroup;
import fr.upmc.mdoc.tp1.models.Entreprise;
import fr.upmc.mdoc.tp1.models.PhoneNumber;

/**
 * La classe <code>NewContactForm</code>
 * */
public class NewContactForm extends ActionForm {

	private static final long serialVersionUID = 1L;
	private String firstName;
	private String lastName;
	private String email;
	private String street;
	private String city;
	private String zip;
	private String country;
	private String phoneFixe;
	private String phonePort;
	private String phoneBureau;
	private String entreprise;

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getStreet() {
		return street;
	}

	public void setStreet(String street) {
		this.street = street;
	}

	public String getCity() {
		return city;
	}

	public void setCity(String city) {
		this.city = city;
	}

	public String getZip() {
		return zip;
	}

	public void setZip(String zip) {
		this.zip = zip;
	}

	public String getCountry() {
		return country;
	}

	public void setCountry(String country) {
		this.country = country;
	}

	public String getPhoneFixe() {
		return phoneFixe;
	}

	public void setPhoneFixe(String phoneFixe) {
		this.phoneFixe = phoneFixe;
	}

	public String getPhonePort() {
		return phonePort;
	}

	public void setPhonePort(String phonePort) {
		this.phonePort = phonePort;
	}

	public String getPhoneBureau() {
		return phoneBureau;
	}

	public void setPhoneBureau(String phoneBureau) {
		this.phoneBureau = phoneBureau;
	}

	public String getEntreprise() {
		return entreprise;
	}

	public void setEntreprise(String entreprise) {
		this.entreprise = entreprise;
	}

	
	/**
	 * La méthode <code>create</code> s'occupe d'instancier toutes les données
	 * correspondants à un contact et celles liées à un contacts
	 * 
	 * @param request
	 * @return le contact crée
	 */
	public Contact create(HttpServletRequest request) {

		Contact contact;

		if (getEntreprise() == null)
			contact = new Contact(firstName, lastName, email);
		else
			contact = new Entreprise(); /* Entreprise */

		// L'adresse du contact
		Address adr = new Address();
		adr.setStreet(street);
		adr.setCity(city);
		adr.setCountry(country);
		adr.setZip(zip);

		contact.setAddress(adr);

		// Les téléphones du contact
		contact.getPhones().add(
				new PhoneNumber("fixe", getPhoneFixe(), contact));
		contact.getPhones().add(
				new PhoneNumber("port", getPhonePort(), contact));
		contact.getPhones().add(
				new PhoneNumber("bureau", getPhoneBureau(), contact));

		// Les groupes que le contact appartiennent
		DAOContactGroup daog = new DAOContactGroup();
		List<ContactGroup> groups = daog.getGroups();
		// String groupname = request.getParameter("group");

		// Récupération des groupes cochés par l'utilisateur
		String[] tabs = request.getParameterValues("groupname");
		ArrayList<String> groupSaisi = new ArrayList<String>(
				Arrays.asList(tabs));

		for (ContactGroup group : groups)
			for (String g : groupSaisi)
				if (group.getGroupName().equals(g))
					daog.updateGroup(group);

		/*
		 * else { // Il faut avoir la possibilité de créer un groupe
		 * 
		 * 
		 * contact.setBooks(books); }
		 */

		// FIN groupe

					
		return contact;

	}

	/**
	 * La fonction <code>validate</code> s'occupe de valider les champs saisis
	 * par l'utilisateur
	 * 
	 * @param mapping
	 * @param request
	 */
	@Override
	public ActionErrors validate(ActionMapping mapping,
			HttpServletRequest request) {

		ActionErrors errors = new ActionErrors();

		if (getFirstName() == null || getFirstName().length() < 1)
			errors.add("first name", new ActionMessage(
					"Le prénom doit ne peut pas être vide"));

		if (getLastName() == null || getLastName().length() < 1)
			errors.add("last name", new ActionMessage(
					"Le nom doit ne peut pas être vide"));

		if (getEmail() == null || getEmail().length() < 1)
			errors.add("email", new ActionMessage(
					"Le mail doit ne peut pas être vide"));

		if (getCity() == null || getCity().length() < 1)
			errors.add("the city", new ActionMessage(
					"Le nom de la ville ne doit pas être vide"));

		if (getStreet() == null || getStreet().length() < 1)
			errors.add("the street", new ActionMessage(
					"Le nom du rue ne doit pas être vide"));

		if (getCountry() == null || getCountry().length() < 1)
			errors.add("the country", new ActionMessage(
					"Le nom du pays ne doit pas être vide"));

		if (getZip() == null || getZip().length() < 1)
			errors.add("the zip", new ActionMessage(
					"La valeur du code postale ne doit pas être vide"));

		
		return errors;
	}

}
